package com.web.biz.common;
import java.io.File;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadBase.SizeLimitExceededException;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import com.css.sword.kernel.utils.SwordLogUtils;
import com.css.sword.platform.comm.json.JSON;
import com.css.sword.platform.web.controller.BaseDomainCtrl;
import com.css.sword.platform.web.controller.annotations.CTRL;
import com.css.sword.platform.web.event.IReqData;
import com.web.common.utils.FileUploadUtiles;
import com.web.common.utils.ParamConfig;
import com.web.common.utils.StringUtil;


@CTRL("FileUploadCtrl")
public class FileUploadCtrl extends BaseDomainCtrl {

	@SuppressWarnings("unused")
	private static SwordLogUtils log = SwordLogUtils.getLogger(FileUploadCtrl.class);
	
	final long MAX_SIZE = 300 * 1024;// 设置上传文件最大为 300k
	// 允许上传的文件格式的列表
	final String[] allowtype = new String[] {"jpg","jpeg","gif","png"};

	/**
	 * 获取下一个参与者列表
	 */
	@SuppressWarnings("rawtypes")
	public void up(IReqData req) throws Exception {
		HttpServletRequest request = this.getHttpReq();
		HttpServletResponse response = this.getHttpRes();
        response.setContentType("text/html");
        // 设置字符编码为UTF-8, 这样支持汉字显示
        response.setCharacterEncoding("UTF-8");

        // 实例化一个硬盘文件工厂,用来配置上传组件ServletFileUpload
        DiskFileItemFactory dfif = new DiskFileItemFactory();
        dfif.setSizeThreshold(4096);// 设置上传文件时用于临时存放文件的内存大小,这里是4K.多于的部分将临时存在硬盘
        dfif.setRepository(new File(request.getSession().getServletContext().getRealPath("/")+ "uploadtemp"));// 设置存放临时文件的目录,web根目录下的uploadtemp目录
        // 用以上工厂实例化上传组件
        ServletFileUpload sfu = new ServletFileUpload(dfif);
        // 设置最大上传尺寸
        sfu.setSizeMax(MAX_SIZE);
        
        boolean flag = true;
        String message="";
        
        // 从request得到 所有 上传域的列表
        List fileList = null;
        try {
            fileList = sfu.parseRequest(request);
        } catch (FileUploadException e) {// 处理文件尺寸过大异常
            if (e instanceof SizeLimitExceededException) {
                message+="文件尺寸超过规定大小:"+MAX_SIZE+"字节'";
                flag = false;
            }
            e.printStackTrace();
        }
        if (flag = true) {
        	// 没有文件上传
        	if (fileList == null || fileList.size() == 0) {
        		message+="请选择上传文件";
        		flag = false;
        	}else {
        		// 得到所有上传的文件
        		Iterator fileItr = fileList.iterator();
        		// 循环处理所有文件
        		while (fileItr.hasNext()) {
        			FileItem fileItem = null;
        			String path = null;
        			long size = 0;
        			// 得到当前文件
        			fileItem = (FileItem) fileItr.next();
        			// 忽略简单form字段而不是上传域的文件域(<input type="text" />等)
        			if (fileItem == null || fileItem.isFormField()) {
        				continue;
        			}
        			// 得到文件的完整路径
        			path = fileItem.getName();
        			// 得到文件的大小
        			size = fileItem.getSize();
        			if ("".equals(path) || size == 0) {
        				message+="请选择上传文件";
        				flag = false;
        			}else {
        				// 得到去除路径的文件名
        	            String t_name = path.substring(path.lastIndexOf("\\") + 1);
        	            // 得到文件的扩展名(无扩展名时将得到全名)
        	            String t_ext = t_name.substring(t_name.lastIndexOf(".") + 1);
        	            // 拒绝接受规定文件格式之外的文件类型
        	            int allowFlag = 0;
        	            int allowedExtCount = allowtype.length;
        	            for (; allowFlag < allowedExtCount; allowFlag++) {
        	                if (allowtype[allowFlag].equals(t_ext))
        	                    break;
        	            }
        	            if (allowFlag == allowedExtCount) {
        	            	message+="上传文件类型必须为：";
        	                for (allowFlag = 0; allowFlag < allowedExtCount; allowFlag++){
        	                    message+="*." + allowtype[allowFlag]+ " ";
        	                }
        	                flag = false;
        	            }else {
        	            	long now = System.currentTimeMillis();
        	                // 根据系统时间生成上传后保存的文件名
        	                String prefix = String.valueOf(now);
        	                String domainPath = StringUtil.parse2String(FileUploadUtiles.getDomainPath(FileUploadUtiles.DOMAIN_SHOPWEB).get("fileDomainPath"));
        	                // 保存的最终文件完整路径
        	                String fullPath = domainPath + prefix + "." + t_ext;
        	                String imgPath = StringUtil.parse2String(FileUploadUtiles.getDomainPath(FileUploadUtiles.DOMAIN_SHOPWEB).get("imgPath"))+ prefix + "." + t_ext;
        	                String imgDomainPath = ParamConfig.getInstanse().getParam("fileDomainPath")+imgPath;
        	                try {
        	                    // 保存文件
        	                    fileItem.write(new File(fullPath));
        	                    response.setStatus(200);
        	                    message = imgDomainPath;
        	            		flag = true;
        	                } catch (Exception e) {
        	                	e.printStackTrace();
        	                	message+="图片上传失败，请重试";
        	                	flag = false;
        	                }
						}   
					}
        	    }
        	}
        	response.setStatus(200);
        	PrintWriter out = response.getWriter();
            Map<String, Object> resMap = new HashMap<String, Object>();
            resMap.put("flag", flag);	
        	resMap.put("message", message);
        	String jsonStr = JSON.mapToJson(resMap);
        	out.print(jsonStr);
        		
        	out.flush();
        	out.close();
            return;
        }
	}


}